package process

import (
	"fmt"
	"go_example/src/chatroom/common/message"
	"go_example/src/chatroom/server/utils"
	"io"
	"net"
)

type Processor struct {
	Conn net.Conn
}

//根据消息类型，决定调用哪个函数来处理
func (this *Processor) ServerProcessMes(mes *message.Message) (err error) {
	//接收消息提示
	fmt.Println("ServerProcessMes() mes=", mes)

	switch mes.Type {
		case message.LoginMesType:
			//处理登陆，创建一个UserProcess实例
			up := &UserProcess{Conn: this.Conn}
			err = up.ServerProcessLogin(mes)
		case message.RegisterMesType:
			//处理注册
			up := &UserProcess{Conn: this.Conn}
			err = up.ServerProcessRegister(mes)
		case message.SmsMesType:
			//处理群发消息
			smsProcess := &SmsProcess{}
			smsProcess.SendGroupMes(mes)
		case message.SmsUserIdMesType:
			//处理单发消息
			smsProcess := &SmsProcess{}
			smsProcess.SendUserIdMes(mes)
		case message.SmsExitMesType:
			//处理用户退出消息
			smsProcess := &SmsProcess{}
			smsProcess.SendExitMes(mes)
		default:
			fmt.Println("消息类型不存在无法处理")
	}
	return
}
func (this *Processor) ReadMesProcess() (err error) {
	//循环读取客户端发送的信息
	for true {
		//创建一个Transfer实例，处理读取数据包任务
		tf := &utils.Transfer{
			Conn: this.Conn,
		}
		mes, err := tf.ReadPkg()
		if err != nil {
			if err == io.EOF {
				fmt.Println("客户端退出了，服务器也退出了")
				return err
			} else {
				fmt.Println("ReadMesProcess() ReadPkg err=", err)
				return err
			}
		}
		fmt.Println("ReadMesProcess() mes=", mes)
		err = this.ServerProcessMes(&mes)
		if err != nil {
			return err
		}
	}
	return
}
